package cn.itcast.manus.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.itcast.manus.service.FileStorageService;
import lombok.extern.slf4j.Slf4j;
import org.apache.tika.Tika;
import org.jsoup.select.Evaluator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;
import java.util.Map;

@Slf4j
@Service
public class FileStorageServiceImpl implements FileStorageService {

    private final Tika tika =new Tika();
    @Value("D:\\data\\tmp\\my-manus\\")
    private String baseFolder;
    @Value("http://localhost:18081")
    private String domain;

    //保存文件

    /**
     *
     * @param data 文件字节数据
     * @return  返回uuid
     */
    @Override
    public String saveFile(byte[] data) {

        // 生成文件的唯一标识符
        var uuid = IdUtil.fastSimpleUUID();
        // 生成文件路径
        var path = this.getFilePath(uuid);
        // 写入内容到文件中
        FileUtil.writeBytes(data, path);
        return uuid;
    }

    //获取路径
    private String getFilePath(String uuid) {
       return baseFolder+uuid;
    }

    //生成下载url
    @Override
    public String generateDownloadUrl(String name, String uuid) {
        // 规则：http://localhost:18081/content/download/{uuid}?name={name}
        return StrUtil.format("{}{}?name={}",domain,StrUtil.format(DOWNLOAD_PATH,Map.of("uuid",uuid)),name);
    }

    //生成打开路径
    @Override
    public String generateOpenUrl(String uuid) {
        // 规则：http://localhost:18081/content/open/{uuid}
        return StrUtil.format("{}{}",
                domain,
                StrUtil.format(OPEN_PATH, Map.of("uuid", uuid)));
    }

    @Override
    public DownloadTableContent generateDownloadableContent(String uuid) {

//        // 获取文件输入流
//        var is = FileUtil.getInputStream(this.getFilePath(uuid));
        // 生成文件路径    baseFolder+uuid; 自己设置的文件存储路径+uuid 即本地保存文件的路径
        var path = this.getFilePath(uuid);
        // 获取文件的输入流
        var is = FileUtil.getInputStream(path);

        try {
            // 通过tika获取文件类型
            String mimeType  = tika.detect(is);
            // 创建下载内容对象返回
            return new DownloadTableContent(new MediaType(MediaType.valueOf(mimeType),StandardCharsets.UTF_8),is);
        }catch (Exception e){
            log.error("IOException in generateDownloadableContent", e);
            return new DownloadTableContent(MediaType.APPLICATION_OCTET_STREAM, is);
        }

    }
}
